home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7y5.s < prev    next >
Text File  |  1994-11-28  |  16KB  |  463 lines

  1.  
  2. ; Lezione7y5.s    - Paesaggio fatto con 2 soli sprite che scorre
  3.  
  4. ;       Questo esempio mostra come sia possibile generare una intera
  5. ;    schermata usando direttamente i registri di 2 sprite (il 6 e il 7)
  6. ;       La schermata viene inoltre "scrollata"
  7.  
  8.  
  9.     SECTION    CiriCop,CODE
  10.  
  11. Inizio:
  12.     move.l    4.w,a6        ; Execbase
  13.     jsr    -$78(a6)    ; Disable
  14.     lea    GfxName(PC),a1    ; Nome lib
  15.     jsr    -$198(a6)    ; OpenLibrary
  16.     move.l    d0,GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  19.  
  20. ;    Puntiamo un bitplane "vuoto" 
  21.  
  22.     MOVE.L    #BITPLANE,d0    ; dove puntare
  23.     LEA    BPLPOINTERS,A1    ; puntatori COP
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.  
  28. ;    NON Puntiamo lo sprite !!!!!!!!!!!!!!!!!!!!
  29.  
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; nostra COP
  32.     move.w    d0,$dff088        ; START COP
  33.     move.w    #0,$dff1fc        ; NO AGA!
  34.     move.w    #$c00,$dff106        ; NO AGA!
  35.  
  36.  
  37. mouse:
  38.     cmpi.b    #$aa,$dff006    ; Linea $aa?
  39.     bne.s    mouse
  40.  
  41.     bsr.w    MuoviPaesaggio    ; Fa scrorrere il paesaggio
  42.  
  43. Aspetta:
  44.     cmpi.b    #$aa,$dff006    ; linea $aa?
  45.     beq.s    Aspetta
  46.  
  47.     btst    #6,$bfe001    ; mouse premuto?
  48.     bne.s    mouse
  49.  
  50.  
  51.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  52.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable
  56.     move.l    gfxbase(PC),a1
  57.     jsr    -$19e(a6)    ; Closelibrary
  58.     rts
  59.  
  60. ;    Dati
  61.  
  62. GfxName:
  63.     dc.b    "graphics.library",0,0
  64.  
  65. GfxBase:
  66.     dc.l    0
  67.  
  68. OldCop:
  69.     dc.l    0
  70.  
  71.  
  72. ; Questa routine fa scorrere i dati degli sprite che formano il paesaggio
  73.  
  74. MuoviPaesaggio:
  75.     moveq    #14-1,d0    ; numero di righe
  76.     lea    FormaSprite,a0    ; indirizzo primi dati dello sprite
  77. PaeLoop:
  78.  
  79. ; fa scorrere il piano A degli sprite
  80.  
  81.     move.w    (a0),d1        ; legge valore di spr6data
  82.     swap    d1        ; lo mette nella word alta del registro
  83.     move.w    8(a0),d1    ; legge valore di spr7data
  84.  
  85.     ror.l    #1,d1        ; fa scorrere i bit della forma degli sprite
  86.     move.w    d1,8(a0)    ; scrive valore di spr7data
  87.     swap    d1        ; scambia le word del registro
  88.     move.w    d1,(a0)        ; scrive valore di spr6data
  89.  
  90. ; fa scorrere il piano B degli sprite
  91.  
  92.     move.w    4(a0),d1    ; legge valore di spr6datb
  93.     swap    d1        ; lo mette nella word alta del registro
  94.     move.w    12(a0),d1    ; legge valore di spr7datb
  95.  
  96.     ror.l    #1,d1        ; fa scorrere i bit della forma degli sprite
  97.     move.w    d1,12(a0)    ; scrive valore di spr7datb
  98.     swap    d1        ; scambia le word del registro
  99.     move.w    d1,4(a0)    ; scrive valore di spr6datb
  100.  
  101.     add.w    #140,a0        ; prossima riga del paesaggio
  102.     dbra    d0,PaeLoop
  103.  
  104.     rts
  105.  
  106.  
  107.  
  108.     SECTION    GRAPHIC,DATA_C
  109.  
  110. COPPERLIST:
  111. SpritePointers:
  112.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  113.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  114.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  115.     dc.w    $13e,0
  116.  
  117.     dc.w    $8E,$2c81    ; DiwStrt
  118.     dc.w    $90,$2cc1    ; DiwStop
  119.     dc.w    $92,$38        ; DdfStart
  120.     dc.w    $94,$d0        ; DdfStop
  121.     dc.w    $102,0        ; BplCon1
  122.     dc.w    $104,0        ; BplCon2
  123.     dc.w    $108,0        ; Bpl1Mod
  124.     dc.w    $10a,0        ; Bpl2Mod
  125.  
  126.             ; 5432109876543210
  127.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  128.  
  129. BPLPOINTERS:
  130.     dc.w $e0,0,$e2,0    ;primo     bitplane
  131.  
  132.     dc.w    $180,$000    ; color0    ; sfondo nero
  133.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  134.                         ; in questo caso e' vuoto,
  135.                         ; per cui non compare.
  136.  
  137.     dc.w    $01ba,$0fff        ; colore 29
  138.     dc.w    $01bc,$0aaa        ; colore 30
  139.     dc.w    $01be,$0753        ; colore 31
  140.  
  141. ; per comodita` usiamo dei simboli
  142.  
  143. spr6pos        = $170
  144. spr6data    = $174
  145. spr6datb    = $176
  146. spr7pos        = $178
  147. spr7data    = $17c
  148. spr7datb    = $17e
  149.  
  150. ; linea $50 - (le istruzioni copper per una linea sono lunghe 140 bytes)
  151.  
  152.     dc.w    $5025,$fffe    ; Wait
  153.     dc.w    spr6data
  154. FormaSprite:            ; Da questa label faremo gli offset per
  155.     dc.w    $0        ; raggiungere tutti gli altri sprxdat
  156.     dc.w    spr6datb
  157.     dc.w    $0
  158.     dc.w    spr7data
  159.     dc.w    $f000
  160.     dc.w    spr7datb
  161.     dc.w    $0
  162.     dc.w    spr6pos,$40,spr7pos,$48,$504b,$fffe
  163.     dc.w    spr6pos,$50,spr7pos,$58,$505b,$fffe
  164.     dc.w    spr6pos,$60,spr7pos,$68,$506b,$fffe
  165.     dc.w    spr6pos,$70,spr7pos,$78,$507b,$fffe
  166.     dc.w    spr6pos,$80,spr7pos,$88,$508b,$fffe
  167.     dc.w    spr6pos,$90,spr7pos,$98,$509b,$fffe
  168.     dc.w    spr6pos,$a0,spr7pos,$a8,$50ab,$fffe
  169.     dc.w    spr6pos,$b0,spr7pos,$b8,$50bb,$fffe
  170.     dc.w    spr6pos,$c0,spr7pos,$c8,$50cb,$fffe
  171.     dc.w    spr6pos,$d0,spr7pos,$d8,$50db,$fffe
  172.  
  173. ; linea $51
  174.     dc.w    $5125,$fffe
  175.     dc.w    spr6data,$0001,spr6datb,$0000,spr7data,$b800,spr7datb,$4000
  176.     dc.w    spr6pos,$40,spr7pos,$48,$514b,$fffe
  177.     dc.w    spr6pos,$50,spr7pos,$58,$515b,$fffe
  178.     dc.w    spr6pos,$60,spr7pos,$68,$516b,$fffe
  179.     dc.w    spr6pos,$70,spr7pos,$78,$517b,$fffe
  180.     dc.w    spr6pos,$80,spr7pos,$88,$518b,$fffe
  181.     dc.w    spr6pos,$90,spr7pos,$98,$519b,$fffe
  182.     dc.w    spr6pos,$a0,spr7pos,$a8,$51ab,$fffe
  183.     dc.w    spr6pos,$b0,spr7pos,$b8,$51bb,$fffe
  184.     dc.w    spr6pos,$c0,spr7pos,$c8,$51cb,$fffe
  185.     dc.w    spr6pos,$d0,spr7pos,$d8,$51db,$fffe
  186.  
  187. ; linea $52
  188.     dc.w    $5225,$fffe
  189.     dc.w    spr6data,$0003,spr6datb,$0000,spr7data,$bc00,spr7datb,$4000
  190.     dc.w    spr6pos,$40,spr7pos,$48,$524b,$fffe
  191.     dc.w    spr6pos,$50,spr7pos,$58,$525b,$fffe
  192.     dc.w    spr6pos,$60,spr7pos,$68,$526b,$fffe
  193.     dc.w    spr6pos,$70,spr7pos,$78,$527b,$fffe
  194.     dc.w    spr6pos,$80,spr7pos,$88,$528b,$fffe
  195.     dc.w    spr6pos,$90,spr7pos,$98,$529b,$fffe
  196.     dc.w    spr6pos,$a0,spr7pos,$a8,$52ab,$fffe
  197.     dc.w    spr6pos,$b0,spr7pos,$b8,$52bb,$fffe
  198.     dc.w    spr6pos,$c0,spr7pos,$c8,$52cb,$fffe
  199.     dc.w    spr6pos,$d0,spr7pos,$d8,$52db,$fffe
  200.  
  201. ; linea $53
  202.     dc.w    $5325,$fffe
  203.     dc.w    spr6data,$0002,spr6datb,$0001,spr7data,$ec00,spr7datb,$1200
  204.     dc.w    spr6pos,$40,spr7pos,$48,$534b,$fffe
  205.     dc.w    spr6pos,$50,spr7pos,$58,$535b,$fffe
  206.     dc.w    spr6pos,$60,spr7pos,$68,$536b,$fffe
  207.     dc.w    spr6pos,$70,spr7pos,$78,$537b,$fffe
  208.     dc.w    spr6pos,$80,spr7pos,$88,$538b,$fffe
  209.     dc.w    spr6pos,$90,spr7pos,$98,$539b,$fffe
  210.     dc.w    spr6pos,$a0,spr7pos,$a8,$53ab,$fffe
  211.     dc.w    spr6pos,$b0,spr7pos,$b8,$53bb,$fffe
  212.     dc.w    spr6pos,$c0,spr7pos,$c8,$53cb,$fffe
  213.     dc.w    spr6pos,$d0,spr7pos,$d8,$53db,$fffe
  214.  
  215. ; linea $54
  216.     dc.w    $5425,$fffe
  217.     dc.w    spr6data,$0007,spr6datb,$0000,spr7data,$2b00,spr7datb,$d400
  218.     dc.w    spr6pos,$40,spr7pos,$48,$544b,$fffe
  219.     dc.w    spr6pos,$50,spr7pos,$58,$545b,$fffe
  220.     dc.w    spr6pos,$60,spr7pos,$68,$546b,$fffe
  221.     dc.w    spr6pos,$70,spr7pos,$78,$547b,$fffe
  222.     dc.w    spr6pos,$80,spr7pos,$88,$548b,$fffe
  223.     dc.w    spr6pos,$90,spr7pos,$98,$549b,$fffe
  224.     dc.w    spr6pos,$a0,spr7pos,$a8,$54ab,$fffe
  225.     dc.w    spr6pos,$b0,spr7pos,$b8,$54bb,$fffe
  226.     dc.w    spr6pos,$c0,spr7pos,$c8,$54cb,$fffe
  227.     dc.w    spr6pos,$d0,spr7pos,$d8,$54db,$fffe
  228.  
  229. ; linea $55
  230.     dc.w    $5525,$fffe
  231.     dc.w    spr6data,$001c,spr6datb,$0003,spr7data,$e780,spr7datb,$1800
  232.     dc.w    spr6pos,$40,spr7pos,$48,$554b,$fffe
  233.     dc.w    spr6pos,$50,spr7pos,$58,$555b,$fffe
  234.     dc.w    spr6pos,$60,spr7pos,$68,$556b,$fffe
  235.     dc.w    spr6pos,$70,spr7pos,$78,$557b,$fffe
  236.     dc.w    spr6pos,$80,spr7pos,$88,$558b,$fffe
  237.     dc.w    spr6pos,$90,spr7pos,$98,$559b,$fffe
  238.     dc.w    spr6pos,$a0,spr7pos,$a8,$55ab,$fffe
  239.     dc.w    spr6pos,$b0,spr7pos,$b8,$55bb,$fffe
  240.     dc.w    spr6pos,$c0,spr7pos,$c8,$55cb,$fffe
  241.     dc.w    spr6pos,$d0,spr7pos,$d8,$55db,$fffe
  242.  
  243. ; linea $56
  244.     dc.w    $5625,$fffe
  245.     dc.w    spr6data,$803e,spr6datb,$0001,spr7data,$9ac1,spr7datb,$6500
  246.     dc.w    spr6pos,$40,spr7pos,$48,$564b,$fffe
  247.     dc.w    spr6pos,$50,spr7pos,$58,$565b,$fffe
  248.     dc.w    spr6pos,$60,spr7pos,$68,$566b,$fffe
  249.     dc.w    spr6pos,$70,spr7pos,$78,$567b,$fffe
  250.     dc.w    spr6pos,$80,spr7pos,$88,$568b,$fffe
  251.     dc.w    spr6pos,$90,spr7pos,$98,$569b,$fffe
  252.     dc.w    spr6pos,$a0,spr7pos,$a8,$56ab,$fffe
  253.     dc.w    spr6pos,$b0,spr7pos,$b8,$56bb,$fffe
  254.     dc.w    spr6pos,$c0,spr7pos,$c8,$56cb,$fffe
  255.     dc.w    spr6pos,$d0,spr7pos,$d8,$56db,$fffe
  256.  
  257. ; linea $57
  258.     dc.w    $5725,$fffe
  259.     dc.w    spr6data,$c079,spr6datb,$0006,spr7data,$b6e7,spr7datb,$4910
  260.     dc.w    spr6pos,$40,spr7pos,$48,$574b,$fffe
  261.     dc.w    spr6pos,$50,spr7pos,$58,$575b,$fffe
  262.     dc.w    spr6pos,$60,spr7pos,$68,$576b,$fffe
  263.     dc.w    spr6pos,$70,spr7pos,$78,$577b,$fffe
  264.     dc.w    spr6pos,$80,spr7pos,$88,$578b,$fffe
  265.     dc.w    spr6pos,$90,spr7pos,$98,$579b,$fffe
  266.     dc.w    spr6pos,$a0,spr7pos,$a8,$57ab,$fffe
  267.     dc.w    spr6pos,$b0,spr7pos,$b8,$57bb,$fffe
  268.     dc.w    spr6pos,$c0,spr7pos,$c8,$57cb,$fffe
  269.     dc.w    spr6pos,$d0,spr7pos,$d8,$57db,$fffe
  270.  
  271. ; linea $58
  272.     dc.w    $5825,$fffe
  273.     dc.w    spr6data,$c07f,spr6datb,$0048,spr7data,$fff6,spr7datb,$2009
  274.     dc.w    spr6pos,$40,spr7pos,$48,$584b,$fffe
  275.     dc.w    spr6pos,$50,spr7pos,$58,$585b,$fffe
  276.     dc.w    spr6pos,$60,spr7pos,$68,$586b,$fffe
  277.     dc.w    spr6pos,$70,spr7pos,$78,$587b,$fffe
  278.     dc.w    spr6pos,$80,spr7pos,$88,$588b,$fffe
  279.     dc.w    spr6pos,$90,spr7pos,$98,$589b,$fffe
  280.     dc.w    spr6pos,$a0,spr7pos,$a8,$58ab,$fffe
  281.     dc.w    spr6pos,$b0,spr7pos,$b8,$58bb,$fffe
  282.     dc.w    spr6pos,$c0,spr7pos,$c8,$58cb,$fffe
  283.     dc.w    spr6pos,$d0,spr7pos,$d8,$58db,$fffe
  284.  
  285. ; linea $59
  286.     dc.w    $5925,$fffe
  287.     dc.w    spr6data,$e06f,spr6datb,$0096,spr7data,$7eaf,spr7datb,$a150
  288.     dc.w    spr6pos,$40,spr7pos,$48,$594b,$fffe
  289.     dc.w    spr6pos,$50,spr7pos,$58,$595b,$fffe
  290.     dc.w    spr6pos,$60,spr7pos,$68,$596b,$fffe
  291.     dc.w    spr6pos,$70,spr7pos,$78,$597b,$fffe
  292.     dc.w    spr6pos,$80,spr7pos,$88,$598b,$fffe
  293.     dc.w    spr6pos,$90,spr7pos,$98,$599b,$fffe
  294.     dc.w    spr6pos,$a0,spr7pos,$a8,$59ab,$fffe
  295.     dc.w    spr6pos,$b0,spr7pos,$b8,$59bb,$fffe
  296.     dc.w    spr6pos,$c0,spr7pos,$c8,$59cb,$fffe
  297.     dc.w    spr6pos,$d0,spr7pos,$d8,$59db,$fffe
  298.  
  299. ; linea $5a
  300.     dc.w    $5a25,$fffe
  301.     dc.w    spr6data,$61ed,spr6datb,$9013,spr7data,$dfff,spr7datb,$6cab
  302.     dc.w    spr6pos,$40,spr7pos,$48,$5a4b,$fffe
  303.     dc.w    spr6pos,$50,spr7pos,$58,$5a5b,$fffe
  304.     dc.w    spr6pos,$60,spr7pos,$68,$5a6b,$fffe
  305.     dc.w    spr6pos,$70,spr7pos,$78,$5a7b,$fffe
  306.     dc.w    spr6pos,$80,spr7pos,$88,$5a8b,$fffe
  307.     dc.w    spr6pos,$90,spr7pos,$98,$5a9b,$fffe
  308.     dc.w    spr6pos,$a0,spr7pos,$a8,$5aab,$fffe
  309.     dc.w    spr6pos,$b0,spr7pos,$b8,$5abb,$fffe
  310.     dc.w    spr6pos,$c0,spr7pos,$c8,$5acb,$fffe
  311.     dc.w    spr6pos,$d0,spr7pos,$d8,$5adb,$fffe
  312.  
  313. ; linea $5b
  314.     dc.w    $5b25,$fffe
  315.     dc.w    spr6data,$db9f,spr6datb,$72ed,spr7data,$ffff,spr7datb,$dbee
  316.     dc.w    spr6pos,$40,spr7pos,$48,$5b4b,$fffe
  317.     dc.w    spr6pos,$50,spr7pos,$58,$5b5b,$fffe
  318.     dc.w    spr6pos,$60,spr7pos,$68,$5b6b,$fffe
  319.     dc.w    spr6pos,$70,spr7pos,$78,$5b7b,$fffe
  320.     dc.w    spr6pos,$80,spr7pos,$88,$5b8b,$fffe
  321.     dc.w    spr6pos,$90,spr7pos,$98,$5b9b,$fffe
  322.     dc.w    spr6pos,$a0,spr7pos,$a8,$5bab,$fffe
  323.     dc.w    spr6pos,$b0,spr7pos,$b8,$5bbb,$fffe
  324.     dc.w    spr6pos,$c0,spr7pos,$c8,$5bcb,$fffe
  325.     dc.w    spr6pos,$d0,spr7pos,$d8,$5bdb,$fffe
  326.  
  327. ; linea $5c
  328.     dc.w    $5c25,$fffe
  329.     dc.w    spr6data,$ffff,spr6datb,$cfbf,spr7data,$ffff,spr7datb,$ff3f
  330.     dc.w    spr6pos,$40,spr7pos,$48,$5c4b,$fffe
  331.     dc.w    spr6pos,$50,spr7pos,$58,$5c5b,$fffe
  332.     dc.w    spr6pos,$60,spr7pos,$68,$5c6b,$fffe
  333.     dc.w    spr6pos,$70,spr7pos,$78,$5c7b,$fffe
  334.     dc.w    spr6pos,$80,spr7pos,$88,$5c8b,$fffe
  335.     dc.w    spr6pos,$90,spr7pos,$98,$5c9b,$fffe
  336.     dc.w    spr6pos,$a0,spr7pos,$a8,$5cab,$fffe
  337.     dc.w    spr6pos,$b0,spr7pos,$b8,$5cbb,$fffe
  338.     dc.w    spr6pos,$c0,spr7pos,$c8,$5ccb,$fffe
  339.     dc.w    spr6pos,$d0,spr7pos,$d8,$5cdb,$fffe
  340.  
  341. ; linea $5d
  342.     dc.w    $5d25,$fffe
  343.     dc.w    spr6data,$ffff,spr6datb,$ffff,spr7data,$ffff,spr7datb,$feff
  344.     dc.w    spr6pos,$40,spr7pos,$48,$5d4b,$fffe
  345.     dc.w    spr6pos,$50,spr7pos,$58,$5d5b,$fffe
  346.     dc.w    spr6pos,$60,spr7pos,$68,$5d6b,$fffe
  347.     dc.w    spr6pos,$70,spr7pos,$78,$5d7b,$fffe
  348.     dc.w    spr6pos,$80,spr7pos,$88,$5d8b,$fffe
  349.     dc.w    spr6pos,$90,spr7pos,$98,$5d9b,$fffe
  350.     dc.w    spr6pos,$a0,spr7pos,$a8,$5dab,$fffe
  351.     dc.w    spr6pos,$b0,spr7pos,$b8,$5dbb,$fffe
  352.     dc.w    spr6pos,$c0,spr7pos,$c8,$5dcb,$fffe
  353.     dc.w    spr6pos,$d0,spr7pos,$d8,$5ddb,$fffe
  354.  
  355. ; istruzioni copper per disattivare gli sprite
  356.  
  357.     dc.w    $5e07,$fffe        ; aspetta inizio riga
  358.     dc.w    $172,0            ; spr6ctl
  359.     dc.w    $17a,0            ; spr7ctl
  360.  
  361.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  362.  
  363.  
  364.  
  365.  
  366.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  367.                     ; perche' per vedere gli sprite
  368.                     ; e' necessario che ci siano bitplanes
  369.                     ; abilitati
  370. BITPLANE:
  371.     ds.b    40*256        ; bitplane azzerato lowres
  372.  
  373.     end
  374.  
  375. In questo esempio facciamo scorrere il paesaggio fatto con gli sprite.
  376. A tale scopo non e` possibile usare il registro BPLCON1, che abbiamo usato
  377. per far scorrere i bit-planes, perche` esso non ha effetto sugli sprite.
  378. Per far scorrere il paesaggio dobbiamo far scorrere tutti i pixel che lo
  379. compongono. In questo caso ci e` molto utile il fatto che il paesaggio
  380. sia composto sempre dalla stessa figura che si ripete orizzontalmente
  381. ogni 32 pixel.
  382. Il paesaggio infatti e` costituito da 2 sprite (16 pixel ognuno) che si
  383. ripetono sempre uguali per tutta la riga. Per far scorrere tutto il paesaggio,
  384. bastera` quindi far scorrere i pixel che compongono la forma dei 2 sprite.
  385. Ma tali pixel vengono scritti ad ogni nuova riga del paesaggio nei registri
  386. SPR6DATA, SPR6DATB, SPR7DATA e SPR7DATB.
  387. Quindi dovremo far scorrere il contenuto di questi registri
  388. che si trova nella copperlist. All'indirizzo FormaSprite nella copperlist
  389. possiamo trovare il dato che viene scritto in SPR6DATA nella prima riga del 
  390. paesaggio. Rispettivamente 4,8 e 12 bytes dopo, c'e` il contenuto dei registri
  391. SPR6DATB, SPR7DATA e SPR7DATB, sempre della prima riga.
  392. Facendo scorrere il contenuto dei nostri registri in tutte le 14 righe del
  393. paesaggio avremo raggiunto il nostro scopo.
  394.  
  395. Vediamo ora come si effettua lo scorrimento, per esempio verso destra
  396.  
  397. Noi conosciamo gia` un istruzione che fa scorrere i pixel di una locazione di
  398. memoria o di un registro del 68000, la LSR. Questa istruzione fa scorrere
  399. i bit verso destra e fa entrare a sinistra dei bit di valore 0.
  400. Per esempio:
  401.  
  402.         move.b  #%00100101,d0
  403.         lsr.b   #3,d0
  404.  
  405. dopo queste istruzioni in d0 ci sara` il valore %00000100
  406. Nel nostro caso questo non va bene, perche` i bit di valore 0 che entrano da
  407. sinistra producono un "buco" nello sprite che si allarga sempre di piu`, fino
  408. a cancellare del tutto la figura.
  409.  
  410. Quello che ci occorre e` un'istruzione che faccia scorrere i bit verso
  411. destra, ma che faccia rientrare a sinistra i bit che sono usciti a destra.
  412. Cioe` in pratica che faccia ruotare i bit all'interno del registro.
  413. Questa istruzione esiste, e si chiama ROR ("ROtate Right")
  414. Vediamo subito un esempio:
  415.  
  416.         move.b  #%00100101,d0
  417.         ror.b   #3,d0
  418.  
  419. dopo queste istruzioni in d0 ci sara` il valore %10100100. In pratica i 3
  420. bit che prima della ROR si trovavano a destra sono rientrati da sinistra,
  421. seguendo il percorso indicato sotto:
  422.  
  423. bit:     7 6 5 4 3 2 1 0
  424.         -----------------
  425.         | | | | | | | | |
  426.         -----------------
  427.        ->   -->   -->   -->
  428.       |                     |   direzione di scorrimento.
  429.         <--   <--   <--   <-
  430.  
  431. La routine "MuoviPaesaggio" utilizza un'istruzione ROR per far scorrere
  432. i pixel. Notate che il contenuto del registro SPR6DATA e il contenuto di
  433. SPR7DATA vengono messi nello stesso registro e vengono fatti ruotare
  434. insieme, in modo che i bit che escono a sinistra da SPR6DATA entrano a destra
  435. in SPR7DATA e i bit che escono a sinistra da SPR7DATA entrano a destra in
  436. SPR6DATA.
  437. La stessa operazione viene ripetuta anche per i contenuti dei registri 
  438. SPR6DATB e SPR7DATB che costituiscono il secondo piano degli sprite.
  439.  
  440. Per rendervi conto meglio della differenza tra la LSR e la ROR, provate
  441. a sostituire LSR al posto di ROR nella routine "MuoviPaesaggio".
  442. Vedrete che non e` esattamente quello che volevamo!
  443.  
  444. Naturalmente oltre alla ROR esiste un'istruzione per ruotare i bit verso
  445. sinistra, che si chiama ROL ("ROtate Left") e che funziona esattamente nello
  446. stesso modo. Potete tranquillamente sostituirla a ROR e vedrete il paesaggio
  447. scorrere in direzione opposta.
  448.  
  449. In teoria con soli 2 sprite si potrebbe riempire tutto lo schermo, partendo
  450. dalle nuvole in alto, poi i monti, la prateria e gli alberelli in primo piano,
  451. e si potrebbe anche far scorrere a diverse velocita' i vari livelli della
  452. parallasse, cioe' i monti "lontani" piu' piano, la prateria velocita' media,
  453. gli alberi in primo piano velocemente. Tutto cio' richiederebbe una copperlist
  454. enorme e la routine per muovere tutto sarebbe molto lenta, questo e' uno dei
  455. motivi per cui le parallassi di questo genere sono fatte con i bitplanes, che
  456. sono piu' colorati e veloci da muovere. Comunque se qualcuno osasse dire che
  457. l'Amiga ha solo 8 piccoli sprites, potreste fargli vedere la schermata in
  458. parallasse fatta con gli sprites in sovraimpressione su un disegno a 4096
  459. colori HAM, e vi rimarrebbero anche 6 sprites per farci le stelline e qualche
  460. astronave. Se poi ci faceste girare in mezzo anche un centinaio di BOB col
  461. blitter... forse non si capirebbe piu' niente, ma sarebbe interessante.
  462.  
  463.